#include "../include/cds.h"

#ifndef Hash_SIGNAL
#define Hash_SIGNAL


// （亟待完善）存值，维度信息调用变量... 更正  C语言 数组传入变量时报错

typedef struct _FuncValue* pFuncValue;
typedef struct _FuncValue//12.17参数个数
{
    int attr;//'int' 或 'void'//返回类型
    int start;// TAC中声明的位置
    int Params;// 参数个数
    HashMap* Vars;// KEY : name ; value : VarsValue
}FuncValue;

typedef struct _VarsValue* pVarsValue;
typedef struct _VarsValue//数组
{
    int attr1;//tok_CONST = 260或者为0// 类型检查
    int attr2;//'int'现在只有int// 更改为(enum token_T)类型的变量
    int dimcount;// 几维的
    //List* dim;//各个维度的值// 这个可以进行越界检查
    int* dim;//各个维度的数量// dim[0] == -1  表示是个指针?
    //List* values;//存储值// 提前做常量传播？// 优化部分？
}VarsValue;

// 初始化各个符号表
void initFuncMap();

//---------下面是置入---------//

// 将函数置入符号表
// 给TAC的接口
void insertFuncSignal(char* funcname, int attr, int start);

// (预处理) 即 dimcount *dim 的计算
// 生成pVarsValue，调用initpVarsValue()在TAC.c里面完成
// 方便检查

// 将变量置入符号表
// 置入变量KEY:name;VALUE:pVarsValue 值 
// 给TAC的接口 
void InsertVars(char* funcname, char* name, pVarsValue value);

//生成VALUE:pVarsValue 值
// 参数含义见上
// 给TAC的接口 (预处理1)
pVarsValue initpVarsValue(int attr1, int attr2, int dimcount, int* dim);



//---------下面是查询---------//


// 查询函数中有多少参数
int getParamsNum();

// 获取FuncValue 值
pFuncValue getFuncValue(char name[]);

// 获取偏移量
char* ijktooffset(char* funcname,int dimcount, int* dimijk, char* name);



// 更改主要目的是SSA和优化部分? //
//---------下面是更改---------//




//---------下面是想法---------//

// 置入函数时调用这个函数，将函数STARTID映射为名字
/*
void putinfuncsignal(char funcname[], int startid, int attr1);

HashMap* FuncIDName;
//key : char * startID(TAC) ; value : char * funcname;
*/

// -----------旧代码----------- //
/*
旧代码
// 置入Func HASH表 即 函数的表
void insertFunc(char funcname[], pFuncValue FuncVal);

// 置入FuncIDName Hash
void insertFuncIDName(int start, char funcname[]);

// 获取Name
char* getFuncName(int start);

//生成函数 值
pFuncValue initFuncValue(int attr, int start);

//获取函数 值
//pFuncValue getFuncValue(char name[]);

// 置入变量KEY:name;VALUE:变量 值
//void InsertVars(pFuncValue self, char name[], pVarsValue value);

// 获取变量+偏移 值
bool  getVarsValue(pFuncValue self, char name[], int dim[], int* num);

// 更改变量+偏移 值
bool  changeVarsValue(pFuncValue self, char name[], int dim[], int num);
*/
#endif